package com.eian.boot.crypto.constant;

/**
 * 加密组件常量
 * <p>
 * 统一管理加密组件中使用的常量值，避免硬编码
 *
 * @author eian
 */
public final class CryptoConstants {

    private CryptoConstants() {
    }

    /**
     * 算法名称常量
     */
    public static final class Algorithm {
        /**
         * AES 算法
         */
        public static final String AES = "AES";
        /**
         * RSA 算法
         */
        public static final String RSA = "RSA";
        /**
         * SM2 算法（国密）
         */
        public static final String SM2 = "SM2";
        /**
         * SM4 算法（国密）
         */
        public static final String SM4 = "SM4";

        private Algorithm() {
        }
    }

    /**
     * 安全提供者（Provider）常量
     */
    public static final class Provider {
        /**
         * BouncyCastle 提供者（支持国密算法）
         */
        public static final String BOUNCY_CASTLE = "BC";
        /**
         * SunJCE 提供者（对称加密）
         */
        public static final String SUN_JCE = "SunJCE";
        /**
         * SunRsaSign 提供者（非对称加密）
         */
        public static final String SUN_RSA_SIGN = "SunRsaSign";

        private Provider() {
        }
    }

    /**
     * 密钥长度常量（位）
     */
    public static final class KeySize {
        /**
         * AES 密钥长度 - 128位
         */
        public static final int AES_128 = 128;
        /**
         * AES 密钥长度 - 192位
         */
        public static final int AES_192 = 192;
        /**
         * AES 密钥长度 - 256位（推荐）
         */
        public static final int AES_256 = 256;
        /**
         * SM4 密钥长度 - 128位
         */
        public static final int SM4_128 = 128;
        /**
         * RSA 密钥长度 - 1024位（不推荐）
         */
        public static final int RSA_1024 = 1024;
        /**
         * RSA 密钥长度 - 2048位（推荐）
         */
        public static final int RSA_2048 = 2048;
        /**
         * RSA 密钥长度 - 4096位（高安全）
         */
        public static final int RSA_4096 = 4096;
        /**
         * SM2 密钥长度 - 256位
         */
        public static final int SM2_256 = 256;

        private KeySize() {
        }
    }

    /**
     * 初始化向量（IV）长度常量（字节）
     */
    public static final class IvLength {
        /**
         * AES-CBC IV长度 - 16字节
         */
        public static final int AES_CBC = 16;
        /**
         * AES-GCM IV长度 - 12字节（推荐）
         */
        public static final int AES_GCM = 12;
        /**
         * SM4-CBC IV长度 - 16字节
         */
        public static final int SM4_CBC = 16;

        private IvLength() {
        }
    }

    /**
     * GCM 模式相关常量
     */
    public static final class GCM {
        /**
         * GCM 认证标签长度（位）
         */
        public static final int TAG_LENGTH = 128;
        /**
         * GCM IV长度（字节）
         */
        public static final int IV_LENGTH = 12;

        private GCM() {
        }
    }

    /**
     * 编码常量
     */
    public static final class Charset {
        /**
         * UTF-8 编码
         */
        public static final String UTF_8 = "UTF-8";

        private Charset() {
        }
    }

    /**
     * 密钥存储默认配置
     */
    public static final class KeyStore {
        /**
         * 默认最大存储数量
         */
        public static final int DEFAULT_MAX_SIZE = 1000;
        /**
         * 默认过期时间（秒）- 1小时
         */
        public static final long DEFAULT_EXPIRE_SECONDS = 3600;
        /**
         * Redis键前缀
         */
        public static final String REDIS_KEY_PREFIX = "crypto:key:";

        private KeyStore() {
        }
    }

    /**
     * 默认配置值
     */
    public static final class Defaults {
        /**
         * 默认 AES 密钥长度
         */
        public static final int AES_KEY_SIZE = KeySize.AES_256;
        /**
         * 默认 RSA 密钥长度
         */
        public static final int RSA_KEY_SIZE = KeySize.RSA_2048;
        /**
         * 默认 SM4 密钥长度
         */
        public static final int SM4_KEY_SIZE = KeySize.SM4_128;
        /**
         * 默认 SM2 密钥长度
         */
        public static final int SM2_KEY_SIZE = KeySize.SM2_256;

        private Defaults() {
        }
    }
}

